using Cysharp.Threading.Tasks;
using IQIGame.Onigao.Framework;
using NetProtocol.Enum;

namespace IQIGame.Onigao.GamePlay
{
    /// <summary>
    /// 跟踪NPC玩法模块（TController）
    /// </summary>
    public class LevelPlayNpcTailingCtrl : LevelPlaySubBaseCtrl
    {
        #region fields
        private LevelNpcTailingContainer _container;
        private bool _isStarted;
        #endregion fields

        #region lifecycle
        protected override void OnModuleGameplayInit()
        {

        }

        protected override void OnSceneLoaded()
        {

        }

        protected override void OnUpdate(float deltaTime)
        {
            base.OnUpdate(deltaTime);
            if (_container != null)
            {
                _container.OnUpdate(deltaTime);
            }
        }

        protected override void OnDispose()
        {
            Release();
        }
        #endregion lifecycle

        #region public api
        public async UniTaskVoid StartTailing(int cid)
        {
            if (_isStarted)
            {
                LogGame.LogError("跟踪npc游戏已经开始");
                return;
            }
            var isSuccess = await regionCtrl.levelPlayCtrl.SwitchPhasing(GameScenePhasing.ClientPlay);
            if (!isSuccess)
            {
                LogGame.LogError("切换位面失败");
                return;
            }
            //创建容器，开始小游戏逻辑
            //注意这里必须创建一个新的容器类，不能把逻辑直接写到TController里，因为这样不需要专门去置空绑定的预设节点（TController在关卡销毁前是常驻的）
            _container = new LevelNpcTailingContainer();
            await _container.Start(cid);

            _isStarted = true;
        }

        public async UniTaskVoid EndTailing()
        {
            if (!_isStarted)
            {
                return;
            }
            _isStarted = false;

            //切回主位面
            //如需传送到指定位置，可通过SwitchPhasing第二个参数设置
            //如需传回起始位置，请自行纪录并把regionCtrl.entityCtrl.GetMainCharacter()放回原位(SyncEntityPos)
            var isSuccess = await regionCtrl.levelPlayCtrl.SwitchPhasing(GameScenePhasing.Main);
            if (!isSuccess)
            {
                LogGame.LogError("切换位面失败");
            }

            Release();
        }
        #endregion

        private void Release()
        {
            _container?.Dispose();
            _container = null;
        }
    }
}
